import $Fw from './index.js'
let Format = {
  /**
   * 传入年份返回年份对应总周期
   * @param year
   */
  getNumOfWeeks: function (year) {
    //
    var d = new Date(year, 0, 1);
    // 润年366
    var yt = ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) ? 366 : 365;
    //
    return Math.ceil((yt - d.getDay()) / 7.0);
  },
  /**
   * 传入年份和周期索引，返回对应日期(month-date)
   * @param year
   * @param weekIndex
   */
  getDayEveryDay: function (year, weekIndex) {
    //
    var d = new Date(year, 0, 1);
    //
    while (d.getDay() != 1) {
      d.setDate(d.getDate() + 1);
    }
    var to = new Date(year + 1, 0, 1);
    var i = 1;
    var arr = [];
    for (var from = d; from < to;) {
      if (i == weekIndex) {
        arr.push(((from.getMonth() + 1) < 10 ? '0' + (from.getMonth() + 1) : (from.getMonth() + 1)) + '-' + (from.getDate() < 10 ? '0' + from.getDate() : from.getDate()));
      }
      var j = 6;
      while (j > 0) {
        from.setDate(from.getDate() + 1);
        if (i == weekIndex) {
          arr.push(((from.getMonth() + 1) < 10 ? '0' + (from.getMonth() + 1) : (from.getMonth() + 1)) + '-' + (from.getDate() < 10 ? '0' + from.getDate() : from.getDate()));
        }
        j--;
      }
      if (i == weekIndex) {
        return arr;
      }
      from.setDate(from.getDate() + 1);
      i++;
    }
  },
  /**
   * 转换为日期型
   * @param {} v
   * @return {date}
   */
  toDate: function (v) {
    if ($Fw.isDate(v)) {
      return v;
    }
    if ($Fw.isNumber(v * 1)) {
      v = Date.parse(v * 1);
    } else {
      v = Date.parse(this.fmtDate(v, 'yyyy/MM/dd HH:mm:ss'));
    }
    return $Fw.isNumber(v) ? new Date(v) : null;
  },
  /**
   * 从后截取指定位数字符串
   */
  lastSubStr: function (v, num) {
    if (!v) return null;
    if (num > 0) {
      return v.substring(v, v.length - num, num);
    }
    return v;
  },
  /**
   * 利率格式
   * @param {} v	原始数字
   * @param {} format	长度
   * @return {string}
   */
  fmtInterest: function (v, format) {
    // if (!v) return null;
    // var baseNum = 1;
    // baseNum = baseNum.toFixed(format);
    // baseNum = baseNum.replace('.', '');
    // var interestNum = (v / baseNum);
    // interestNum = interestNum.toFixed(format);
    // return interestNum + '%';
    //
    // *100，保留两位小数（不四舍五入），加上%号
    v = Number(v) * 100;
    v = parseFloat(v).toFixed(3);
    v = v.substring(0, v.lastIndexOf('.') + 3);
    return v + '%';
  },
  /**
   * 将CST日期格式化
   * @param {*} strDate CST日期
   * @param {*} format  格式化规则
   * @returns
   */
  fmtCstDate(strDate, format) {
    const dateStr = strDate.split(' ');
    const strGMT = dateStr[0] + ' ' + dateStr[1] + ' ' + dateStr[2] + ' ' + dateStr[5] + ' ' + dateStr[3] + ' GMT+0800';
    return this.fmtDate(new Date(Date.parse(strGMT)), format);
  },
  /**
   * 日期格式化
   * @param {} v
   * @param {} format
   * @return {string}
   */
  fmtDate: function (v, format, /* private */ parse) {
    if (!v) return null;
    if (!$Fw.isDate(v)) {
      if (parse !== false) {
        var value = v;
        v = String(v).replace(/[^0-9.]/gi, '').split('.')[0];
        switch (v.length) {
          // HHmm 2359
          case 4:
            return this.fmtDate('19000101' + v + '00', format || this.dateFormat['HM'], false);
            // HHmmss 235959
          case 6:
            // SM ： yyyymm 和HHMMSS位数一致需要区分
            // return this.fmtDate('19000101' + v, format || this.dateFormat['HMS'], false);//old code
            // sm增加yyyy/MM处理
            if (format === this.dateFormat['YM']) {
              return this.fmtDate(v + '01000000', format, false);
            } else {
              return this.fmtDate('19000101' + v, format || this.dateFormat['HMS'], false);
            }
            // sm增加yyyy/MM处理
            // yyyyMMdd 20151230
            case 8:
              return this.fmtDate(v + '000000', format, false);
              // yyyyMMddHHmmss 20151230235959
            case 14:
              return this.fmtDate(v, format, false);
              // long || other
            default:
              return this.fmtDate($Fw.isNumber(value * 1) ? value * 1 : Date.parse(value), format, false);
        }
      } else {
        if (v.length === 14) {
          // parse
          v = v.substring(0, 4) + '/' + v.substring(4, 6) + '/' + v.substring(6, 8) + ' ' + v.substring(8, 10) + ':' + v.substring(10, 12) + ':' + v.substring(12, 14);
          return this.fmtDate(Date.parse(v), format, false);
        } else {
          // long
          v = new Date(v);
        }
      }
    }
    return v.format(format || this.dateFormat['YMD']);
  },
  /**
   * 日期反格式化
   * @param {} v
   * @return {string}
   */
  unFmtDate: function (v) {
    var format = 'yyyy/MM/dd';
    if (!$Fw.isDate(v) && v) {
      // sm增加yyyy/MM处理
      var YM = v.indexOf('/') !== -1 || false;
      //
      v = String(v).replace(/[^0-9.]/gi, '').split('.')[0];
      switch (v.length) {
        // yyyyMMddHHmmss 20151230235959
        case 14:
          format = 'yyyy/MM/dd HH:mm:ss';
          break;
          // HHmm 2359
        case 4:
          format = 'HH:mm';
          break;
          // HHmmss 235959
        case 6:
          // format = 'HH:mm:ss';//old code...
          // sm增加yyyy/MM处理
          format = YM ? this.dateFormat['YM'] : 'HH:mm:ss';
          break;
      }
    }
    return this.fmtDate(v, format);
  },
  /**
   * 获取指定日期前后多少天的日期
   * @param {*} date 日期 yyyy-MM-dd
   * @param {*} day 天数
   * @returns
   */
  getNextDate(date, day) {
    const dd = new Date(date);
    dd.setDate(dd.getDate() + day);
    const y = dd.getFullYear();
    const m = dd.getMonth() + 1 < 10 ? '0' + (dd.getMonth() + 1) : dd.getMonth() + 1;
    const d = dd.getDate() < 10 ? '0' + dd.getDate() : dd.getDate();
    return y + '-' + m + '-' + d;
  },
  /**
   *获取几个月前的输入日期
   *{param:DateTime} date 输入日期(YYYY-MM-DD)
   *{param:number } monthNum 月数
   *{monthNum:boolean } 默认true，查几个月前的日期，false查后几个月的日期
   */
  getPreMonthDay: function (date, monthNum, flag = true) {
    monthNum = parseInt(monthNum);
    const dateArr = date.split('-');
    const year = dateArr[0]; // 获取当前日期的年份
    const month = dateArr[1]; // 获取当前日期的月份
    const day = dateArr[2]; // 获取当前日期的日
    let days = new Date(year, month, 0);
    days = days.getDate(); // 获取当前日期中月的天数
    var year2 = year;
    var month2 = '';
    if (flag) {
      month2 = parseInt(month) - monthNum;
    } else {
      month2 = parseInt(month) + monthNum;
    }
    if (month2 <= 0 && flag) {
      year2 =
        parseInt(year2) -
        parseInt(month2 / 12 == 0 ? 1 : Math.abs(parseInt(month2 / 12)) + 1)
      month2 = 12 - (Math.abs(month2) % 12)
    }
    if (month2 > 12) {
      if (month2 % 12 == 0) {
        year2 = parseInt(year2) + parseInt(month2) / 12 - 1;
        month2 = 12;
      } else {
        year2 = parseInt(year2) + parseInt((parseInt(month2) / 12 == 0 ? 1 : parseInt(month2) / 12));
        month2 = parseInt(month2) % 12;
      }

    }
    let day2 = day;
    let days2 = new Date(year2, month2, 0);
    days2 = days2.getDate();
    if (day2 > days2) {
      day2 = days2;
    }
    if (month2 < 10) {
      month2 = '0' + month2;
    }
    const t2 = year2 + '-' + month2 + '-' + day2;
    return t2;
  },
  /**
   *获取几个月后的输入日期
   *{param:DateTime} date 输入日期(YYYY-MM-DD)
   *{param:number } monthNum 月数
   */
  getNxtMonthDay(date, monthNum) {
    return this.getPreMonthDay(date, monthNum, false);
  },

  /**
   * 最高单位文字转换
   * @param {*} v 金额
   * @returns
   */
  fmtChineseUnit(v) {
    v = Math.abs(this.unFmtAmt(v));
    var number = Math.round(v * 100) / 100;
    number = number.toString(10).split('.');
    var a = String(number[0]);
    const unitArr = ['佰', '仟', '万', '十万', '佰万', '仟万', '亿', '十亿', '佰亿', '仟亿', '万亿'];
    const index = a.length - 3;
    if (index >= 0) {
      return unitArr[index];
    } else {
      return '';
    }
  },
  /**
   * 数字格式化
   * @param v 原始数字
   * @param format 格式/小数点后保留位数（默认为2）
   * 0 - 123456
   * 0.00 - 123456.78
   * 0.0000 - 123456.7890
   * 0,000 - 123,456
   * 0,000.00 - 123,456.78
   * 0,0.00 - 123,456.78
   * @return {string}
   */
  fmtNumber: function (v, format) {
    if (!$Fw.isDefined(format)) {
      format = '0.00';
    }
    if ($Fw.isNumber(format)) {
      if (format <= 0) {
        format = '0';
      } else {
        format = '0.' + '0'.repeat(format);
      }
    }

    //
    v = v * 1;
    if (!$Fw.isNumber(v)) {
      return '';
    }
    var comma = ',';
    var dec = '.';
    var i18n = false;
    var neg = v < 0;
    v = Math.abs(v);
    if (format.substr(format.length - 2) == '/i') {
      format = format.substr(0, format.length - 2);
      i18n = true;
      comma = '.';
      dec = ',';
    }
    var hasComma = format.indexOf(comma) != -1;
    var psplit = (i18n ? format.replace(/[^\d\,]/g, '') : format.replace(/[^\d\.]/g, '')).split(dec);
    if (psplit.length > 1) {
      const len = psplit[1].length;
      // 兼容位数大的时候toFixed失去精度，例如：this.fmtAmt('98769983496815.6','￥',2)
      let v2 = String(v);
      let decimals = ''
      if (v2.indexOf('.') != -1) {
        decimals = v2.slice(v2.indexOf('.') + 1);
        if (decimals.length == 1) {
          for (let index = 0; index < (len-1); index++) {
            v2 += '0'
          }
          v = v2
        }else if(decimals.length == 2) {
          //  不做处理
          for (let index = 0; index < (len-2); index++) {
            v2 += '0'
          }
          v = v2
        }else{
          v = v.toFixed(len);
        }
      } else {
        v = v.toFixed(len);
      }
      // 兼容位数大的时候toFixed失去精度-end
    } else if (psplit.length > 2) {
      throw ('NumberFormatException: invalid format, formats should have no more than 1 period: ' + format);
    } else {
      v = v.toFixed(0);
    }
    var fnum = v.toString();
    psplit = fnum.split('.');
    if (hasComma) {
      var cnum = psplit[0];
      var parr = [];
      var j = cnum.length;
      var m = Math.floor(j / 3);
      var n = cnum.length % 3 || 3;
      var i;
      for (i = 0; i < j; i += n) {
        if (i != 0) {
          n = 3;
        }
        parr[parr.length] = cnum.substr(i, n);
        m -= 1;
      }
      fnum = parr.join(comma);
      if (psplit[1]) {
        fnum += dec + psplit[1];
      }
    } else {
      if (psplit[1]) {
        fnum = psplit[0] + dec + psplit[1];
      }
    }
    return (neg ? '-' : '') + format.replace(/[\d,?\.?]+/, fnum);
  },
  /**
   * 数字反格式化
   * 去逗号
   * @param v 格式化数字
   * @return {number}
   */
  unFmtNumber: function (v) {
    if ($Fw.isNumber(v) || !v) {
      return v;
    } else {
      var val = v.replaceAll(',', '') * 1;
      if (!$Fw.isNumber(val)) {
        return v;
      }
      return val;
    }
  },
  /**
   * 帐号格式化、 添加空格分隔符
   * @param  acc {string} 账户号
   * @param mask {boolean}  是否隐藏账户  true为隐藏
   * @return {string}
   * 邮储银行格式要求： 前4位+***+后四位
   */
  fmtAcctNo: function (acc, mask) {
    if ($Fw.isEmpty(acc)) {
      return '';
    }
    acc = String(acc).trim(true);
    var tmpStr = '';
    if (mask) {
      //            acc = this.fmtAcctNo(acc);//帐号格式化
      var start = acc.length - 4;
      if (start < 4) {
        start = 4;
      }
      tmpStr = tmpStr + acc.substring(0, 4) + ' **** **** ' + acc.substring(start, acc.length);
    } else {
      while (acc.length > 4) {
        tmpStr = tmpStr + acc.substring(0, 4);
        tmpStr = tmpStr + ' ';
        acc = acc.substring(4, acc.length);
      }
      tmpStr = tmpStr + acc;
    }
    return tmpStr;
  },
  /**
   * 帐号格式化、 添加空格分隔符
   * 邮储银行格式要求： 前4位+***+后四位
   * mask {boolean}  是否隐藏账户  true为隐藏
   * @param acc
   * @param mask
   * @returns {*}
   */
  fmtAcctShowNo: function (acc, mask) {
    if ($Fw.isEmpty(acc)) {
      return '';
    }
    acc = String(acc).trim(true);
    var tmpStr = '';
    if (mask) {
      var start = acc.length - 4;
      if (start < 4) {
        start = 4;
      }
      tmpStr = tmpStr + acc.substring(0, 4).padEnd(start, '*') + acc.substring(start, acc.length);
    } else {
      while (acc.length > 4) {
        tmpStr = tmpStr + acc.substring(0, 4);
        tmpStr = tmpStr + ' ';
        acc = acc.substring(4, acc.length);
      }
      tmpStr = tmpStr + acc;
    }
    return tmpStr;
  },
  /**
   * 帐号反格式化
   * 去空格（不支持星号反显）
   * @param acc 格式化数字
   * @return {string}
   */
  unFmtAcctNo: function (acc) {
    return String(acc).trim(true);
  },
  /**
   * 格式化只能输入两位小数的数字
   * @param {*} val
   * @param {*} decimal 是否可以输入小数，默认可以
   * @param {*} maxlength 最大输入的正整数
   */
  fmtNum2Decimal(val, decimal = true, maxlength) {
    val = val.replace(/[^\d.]/g, ''); // 清除“数字”和“.”以外的字符
    !decimal && (val = val.replace(/\./g, ''));
    val = val.replace(/\.{2,}/g, '.'); // 只保留第一个. 清除多余的
    val = val.replace('.', '$#$').replace(/\./g, '').replace('$#$', '.');
    val = val.replace(/^(\-)*(\d+)\.(\d\d).*$/, '$1$2.$3'); // 只能输入两个小数
    val == '.' && (val = '0.');
    val = val.replace(/^0(\d*)./g, '0.'); //0.  0和点之间不能输入数字
    val = val.replace(/^(0)([0-9])$/, '$1'); // 保证0后面只能输入点
    const integerLength = Number(maxlength) - 3;
    if (val.indexOf('.') == -1) {
      val.length > integerLength && (val = val.substring(0, integerLength));
    } else {
      const integerNum = val.split('.')[0];
      let integerNum_new = '';
      const decimalNum = val.split('.')[1];
      if (integerNum.length > integerLength) {
        integerNum_new = integerNum.substring(0, integerLength);
        val = `${integerNum_new}.${decimalNum}`
      }
    }
    return val;
  },
  // 手机号脱敏
  fmtPhoneNo(phoneNo) {
    if ($Fw.isEmpty(phoneNo)) {
      return;
    }
    return phoneNo.substring(0, 3) + ' **** ' + phoneNo.slice(-4);
  },
  // 姓名脱敏
  fmtName(name) {
    if ($Fw.isEmpty(name)) {
      return;
    }
    return name.replace(name.substr(0, 1), '*');
  },
  fmtIdnNum(idnNum) {
    if ($Fw.isEmpty(idnNum)) {
      return;
    }
    return idnNum.substring(0, 3) + '***********' + idnNum.slice(-4)
    // return idnNum.replace(/(?<=\d{3})\d{11}(?=\d{1})/,"***********")
  },
  //下面 例如:val的值 是 2020Y6M7D 返回结果为 2020年6个月7天
  fmtTransDate(val) {
    let d = val.replace(/D/g, "天");
    let m = d.replace(/M/g, "个月");
    let y = m.replace(/Y/g, "年");
    return y;
  },
  // 登录页银行卡号脱敏
  fmtCardNoInHome(cardNum) {
    if ($Fw.isEmpty(cardNum)) {
      return;
    }
    return cardNum.substring(0, 4) + '**** ****' + cardNum.slice(-4)
  },
};
export default Format;